/*
 *  Classe AgenciaViagemManagerBean que implementa a interface remota AgenciaViagemManageremote
 * utiliza métodos do pacote Entidades, XML, javax.
 * importa a biblioteca do gerador de xml XStream
 */

package EJB;

import Entidades.*;
import XML.CompaniaXML;
import XML.RotaXML;
import com.thoughtworks.xstream.XStream;
import javax.ejb.Stateless;
import javax.persistence.*;
import java.util.*;
/**
 *
 *
 */
@Stateless
public class AgenciaViagemManagerBean implements AgenciaViagemManagerRemote {
    @PersistenceContext
    EntityManager em;

    public void inserirRotaHasCompania(Compania c, Rota r){
        RotaHasCompania rota = new RotaHasCompania();
        rota.setCompanianome(c);
        rota.setRotanome(r);
        em.persist(rota);
    }

    public Admin validaAdmin(String login,String senha){
       // System.out.println("Login admin");
         Query qProd = em.createNamedQuery("Admin.findAll");
          List<Admin> ListaAdmin = null;
          ListaAdmin = (List)qProd.getResultList();
        //  System.out.println("teste");
          Iterator it = ListaAdmin.iterator();
        while(it.hasNext()){
            Admin adm = (Admin)it.next();
            if(   login.equalsIgnoreCase(adm.getLogin()) &&
                    senha.equalsIgnoreCase(adm.getSenha())){
                    return adm;
            }
        }

        return null;
    }

    public Compania validaCompania(String login,String senha){
        Query qProd = em.createNamedQuery("Compania.findByLogin");
        qProd.setParameter("login",login);
        List<Compania> listaCompania =  qProd.getResultList();

        Iterator it = listaCompania.iterator();
        while(it.hasNext()){
            Compania c = (Compania)it.next();
            if(   login.equalsIgnoreCase(c.getLogin()) &&
                    senha.equalsIgnoreCase(c.getSenha())){
                    return c;
            }
        }
        return null;
    }

    public Cliente validaCliente(String login,String senha){
        Query qProd = em.createNamedQuery("Cliente.findByLogin");
        qProd.setParameter("login",login);
        List<Cliente> listaCliente =  qProd.getResultList();

        Iterator it = listaCliente.iterator();
        while(it.hasNext()){
            Cliente c = (Cliente)it.next();
            if(   login.equalsIgnoreCase(c.getLogin()) &&
                    senha.equalsIgnoreCase(c.getSenha())){
                    return c;
            }
        }
        return null;
    }

    public boolean cadastraCliente(Cliente c){
        try{
            em.persist(c);
        }catch (Exception ex){return false;}
        return true;


    }

    public boolean cadastraRota(Rota r){
        try{
            
            em.persist(r);
        }catch (Exception ex){return false;}
        return true;
    }

    public boolean cadastraPassagem(Passagem p){
        try{
            em.persist(p);
        }catch (Exception ex){return false;}
        return true;
    }

    public boolean cadastraCompania(Compania c){
        try{
            em.persist(c);
        }catch (Exception ex){return false;}
        return true;
    }

    public void removerCompania(Compania c){
        try{
            Query qProd1 = em.createNamedQuery("RotaHasCompania.DeletaRotasDaCompania");
            qProd1.setParameter("companianome",c);
            qProd1.executeUpdate();

            Query qProd = em.createNamedQuery("Compania.deleteCompania");
            qProd.setParameter("nome",c.getNome());
            qProd.executeUpdate();
        }catch(Exception ex){ex.printStackTrace();}
    }


    public Passagem getPassagem(int id){
        return em.find(Passagem.class, id);
    }

     public Rota getRota(String origem,String Destino){
      Rota r= new Rota();
      try{
            Query qProd = em.createNamedQuery("Rota.findNameRota");
            qProd.setParameter("origem",origem);
            qProd.setParameter("destino",Destino);
             r = (Rota) qProd.getSingleResult();

      }catch(Exception ex){ex.printStackTrace();}
      return r;
    }
    
    public List getAllRota(Compania companianome){
      List listaAllRota= null;
      try{
        Query qProd = em.createNamedQuery("RotaHasCompania.findAllRotas");
        qProd.setParameter("companianome",companianome);
        listaAllRota = qProd.getResultList();
        return listaAllRota;
      }catch(Exception ex){ex.printStackTrace();}
      return listaAllRota;
    }


     public List getAllCompanias(){
            Query qProd = em.createNamedQuery("Compania.findAll");
            List<Compania> listaTodasCompanias = qProd.getResultList();
            return listaTodasCompanias;
     }

    public List getCompanias(Rota nome_ROTA){
        List listaRotas=null;
        
        try{
            Query qProd1 = em.createNamedQuery("RotaHasCompania.findCompanias");
            qProd1.setParameter("rotanome", nome_ROTA);
            listaRotas = qProd1.getResultList();
            return listaRotas;
         //   System.out.println("tamanho da lista "+listaRotas.size()); //teste ok
        }catch(Exception ex){ ex.printStackTrace();}
            
            return listaRotas;

    }

    // Pesquisas os passageiros de uma determinada compania conforme a Rota
    public List getPassageiros(Rota nomeRota,Compania nomeCompania){
         List listaPassageiros=null;

        try{
            Query qProd1 = em.createNamedQuery("Passagem.findPassageiros");
            qProd1.setParameter("companianome", nomeCompania);
            qProd1.setParameter("rotanome", nomeRota);
            listaPassageiros = qProd1.getResultList();
            
            return listaPassageiros;
         //   System.out.println("tamanho da lista "+listaRotas.size()); //teste ok
        }catch(Exception ex){ ex.printStackTrace();}
            return listaPassageiros;

     }

    public String TransfXML(Object o){
             XStream x = new XStream();
             x.alias("Rota", RotaXML.class);
             x.alias("Compania", CompaniaXML.class);
              System.out.println(x.toXML(o));
              return x.toXML(o);
    }
    public String getRotaME(String origem,String destino){
        Rota r= new Rota();
      try{
            Query qProd = em.createNamedQuery("Rota.findNameRota");
            qProd.setParameter("origem",origem);
            qProd.setParameter("destino",destino);
             r = (Rota) qProd.getSingleResult();

      }catch(Exception ex){ex.printStackTrace();}
      return r.getNome()+" "+r.getDescricao()+" ";
    }

    public List getAllOrigem(){
        Query qProd = em.createNamedQuery("Rota.findAllOrigem");
        List<Rota> listaOrigem = qProd.getResultList();
        return listaOrigem;
    }
    public List getAllDestino(){
        Query qProd = em.createNamedQuery("Rota.findAllDestino");
        List<Rota> listaDestino = qProd.getResultList();
       
        return listaDestino;
        
    }
        
}

